/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package analisiImmagine;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.util.BitSet;

import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageOutputStream;


/**
 *
 * @author calvelli
 */
public class Analizzatore {
    
    public static void main(String[] ar) throws IOException {
        
                Analizzatore a=new Analizzatore();
                
		BufferedImage immagine = ImageIO.read(new File("C:\\Users\\calvelli\\Desktop\\Nuova cartella\\Cattura1.png"));		
		//BufferedImage immagine = ImageIO.read(new File("C:\\Users\\calvelli\\Desktop\\_DSC9406.jpg"));
		//nuovaImmagine(immagine);
		byte[] b=a.divisioneInByte(immagine);
		String s=a.codificaDaByteABit(b);
		
		byte[] b1=a.codificaDaBitAByte(s);
		ByteArrayInputStream in=new ByteArrayInputStream(b1);
		BufferedImage immagineNuova=ImageIO.read(in);
		a.creaImmagine(immagineNuova);
		
		
		// FileImageOutputStream out1 = new FileImageOutputStream(new
		// File("D:\\imgCompressa.jpg"));

		// BufferedImageOp blurOp = new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,
		// null);

		// BufferedImage bimg = blurOp.filter(buffImage,null);

		
		
		
	}//main
    
    public byte[] codificaDaBitAByte(String bits){
		int splittingSize=8;
		int lowIndex=0, highIndex=splittingSize;
		int bitsLength=bits.length();
		int padding=(splittingSize-(bitsLength % splittingSize));
		//System.out.println(bitsLength % splittingSize);
		String bitsWithPadding=bits;
		if((bitsLength % splittingSize)!=0){
			//aggiungo gli eventuali bit di padding
			for(int i=0; i<padding; i++){
				bitsWithPadding="0"+bitsWithPadding;
			}//for
		}//if serve padding
		
		//System.out.println(bitsWithPadding);
		int bitsWithPaddingLength=bitsWithPadding.length();
		byte[] result=new byte[bitsWithPaddingLength/splittingSize];
		int indexResult=0;
		
		while(lowIndex < bitsWithPaddingLength){
			//System.out.println((byte)Integer.parseInt(bitsWithPadding.substring(lowIndex, highIndex),2));
			result[indexResult]=(byte)Integer.parseInt(bitsWithPadding.substring(lowIndex, highIndex),2);
			lowIndex=highIndex;
			highIndex+=splittingSize;
			indexResult++;
		}//while
		
		return result;
	}//codificaByte
	
	public String daByteABit(byte[] byteArray){
		String result=new String();
		for(int i=0; i<byteArray.length; i++){
			result=new BigInteger(byteArray).toString();
			//result=result+Integer.toBinaryString(new Integer(byteArray[i]));
		}
		return result;
	}//daByteABit
	
	public String codificaDaByteABit(byte[] byteArray){
		int arrayLength=byteArray.length;
		int index=arrayLength-1, power=2, maxPower=128;
		String bits=new String();
		while(index >= 0){
			byte currentByte=byteArray[index];
			int mask=1;
			while(mask <= maxPower){
				if((currentByte & mask) == 0){
					bits="0"+bits;
				}//if((currentByte & mask) == 0)
				else{
					bits="1"+bits;
				}//else
				mask*=power;
			}//while(mask <= maxPower)
			index--;
		}//while
		return bits;
	}//codificaRipetizione
	
	public byte[] divisioneInByte(BufferedImage immagine) throws IOException{
	
		ByteArrayOutputStream byteArrOS = new ByteArrayOutputStream();
		ImageIO.write(immagine, "jpg", byteArrOS);
		byte[] byteImmagine=byteArrOS.toByteArray();
		return byteImmagine;
	}//divisioneInByte
	
	public void nuovaImmagine(BufferedImage immagine) throws IOException{
		ByteArrayOutputStream byteArrOS = new ByteArrayOutputStream();
		ImageIO.write(immagine, "jpg", byteArrOS);
		byte[] byteImmagine=byteArrOS.toByteArray();
		//byte[] byteImmagine1=byteArrOS.toByteArray();
		byte[] nuovo=new byte[byteImmagine.length/2];
		System.arraycopy(byteImmagine, 0, nuovo, 0, byteImmagine.length/2); //copia byteImmagine da posizione 0 fino a length/2 e lo mette in nuovo a partire da posizione 0
		//System.arraycopy(byteImmagine1, 0, nuovo, byteImmagine.length, byteImmagine1.length);
		
		ByteArrayInputStream in=new ByteArrayInputStream(nuovo);
		BufferedImage immagineNuova=ImageIO.read(in);
		creaImmagine(immagineNuova);
		
	}//nuovaImmagine
	
	public void creaImmagine(BufferedImage immagine){
		try {
			ImageIO.write(immagine, "jpg", new File("D:\\imgCompressa1.jpg"));
		} catch (Exception e) {
			System.out.println("Errore: " + e);
		} finally {
			System.exit(0);
		}

	}//creaImmagine
}//classe
